

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStreamWriter;
import java.io.PrintStream;
import java.util.Scanner;

public class LeitorDePPM {

	public int[][] tabuleiro;

	private enum Tipo {
		P1, P4;
	}

	private Tipo tipo;
	public int largura = -1, altura = -1;

	public LeitorDePPM(String arquivo) {
		try {
			arquivo = tirarComentarios(arquivo);
			InputStream in = new FileInputStream(arquivo);
			tabuleiro = tabuleiro(in);
			tabuleiro = inverteTabuleiro(tabuleiro);
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}

	}

	private int[][] inverteTabuleiro(int[][] tabuleiro) {
		int[][] temp = new int[altura][largura];
		for (int y = 0; y < altura; y++) {

			for (int x = 0; x < largura; x++) {
				temp[y][x] = tabuleiro[x][y];
			}
		}
		return temp;
	}

	private String tirarComentarios(String arquivo) throws IOException {
		Scanner scan = new Scanner(new FileInputStream(arquivo));
		OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(arquivo+".sem_comentarios"));
		
		while( scan.hasNextLine() ){
			String linha = scan.nextLine() + "\n";
			if( linha.charAt(0) != '#'  ) osw.write(linha);
		}
		scan.close();
		osw.close();
		return arquivo + ".sem_comentarios"; 	
	}

	private int[][] tabuleiro(InputStream in) throws IOException {

		char c;

		in.read();
		c = (char) in.read();

		if (c == '1')
			tipo = Tipo.P1;
		else
			tipo = Tipo.P4;

		largura = proximoInt(in) + 2;
		altura = proximoInt(in) + 2;

		int[][] tabuleiro = new int[largura][altura];
		for (int y = 0; y < altura - 2; y++) {
			for (int x = 0; x < largura - 1; x++) {
				if (tipo.equals(Tipo.P1)) {
					
					c = proximoChar(in);
					while( c == ' ')
						c = proximoChar(in);
					
					//proximoChar(in);
					//System.out.print(c);
					if (c == '1') {
						tabuleiro[x + 1][y + 1] = 1;
					} else {
						tabuleiro[x + 1][y + 1] = 0;
					}
				} else if (tipo.equals(Tipo.P4)) {
					while (x < largura - 2) {

						int baite = in.read();
						int s = 7;

						for (int j = x; j < x + 8; j++) {
							boolean b = (((baite >> s) & 1) != 0);
							--s;
							if (j < largura - 2)
								if (b) {
									tabuleiro[j + 1][y + 1] = 1;
									// System.out.print(1);
								} else {
									// System.out.print(0);
								}
						}
						x += 8;
					}
				}
			}
			// System.out.println();
		}
		System.out.println();
		System.out.println();

		for (int i = 1; i < altura; i++) {
			if (tabuleiro[1][i] == 1)
				tabuleiro[0][i] = 1;
			if (tabuleiro[largura - 2][i] == 1)
				tabuleiro[largura - 1][i] = 1;
		}
		for (int i = 1; i < largura; i++) {

			if (tabuleiro[i][1] == 1)
				tabuleiro[i][0] = 1;
			if (tabuleiro[i][altura - 2] == 1)
				tabuleiro[i][altura - 1] = 1;
		}

		return tabuleiro;
	}

	private static char proximoChar(InputStream in) throws IOException {
		char c;

		c = (char) in.read();
		if (c == '#') {
			do {
				c = (char) in.read();
			} while (c != '\n' && c != '\r');
		}
		
		return c;
	}

	private static char proximoCharValido(InputStream in) throws IOException {
		char c;

		do {
			c = proximoChar(in);
		} while (c == ' ' || c == '\t' || c == '\n' || c == '\r');

		return c;
	}

	private static int proximoInt(InputStream in) throws IOException {
		char c;
		int i = 0;

		c = proximoCharValido(in);
		do {
			i = i * 10 + c - '0';
			c = proximoChar(in);
		} while (c >= '0' && c <= '9');

		return i;
	}

	public static void main(String[] args) throws FileNotFoundException {
		LeitorDePPM leitorDePPM = new LeitorDePPM("ep/io/P4.pbm");
		int[][] T = leitorDePPM.tabuleiro;
		
		for (int y = 0; y < leitorDePPM.altura; y++) {

			for (int x = 0; x < leitorDePPM.largura; x++) {

				System.out.print(T[y][x]);
				
			}
			System.out.println();
		}

		System.out.println();
		leitorDePPM = new LeitorDePPM("ep/io/feed.pbm");
		T = leitorDePPM.tabuleiro;
		for (int y = 0; y < leitorDePPM.altura; y++) {

			for (int x = 0; x < leitorDePPM.largura; x++) {

				System.out.print(T[y][x]);
			}
			System.out.println();
		}
		
		PrintStream pis = new PrintStream("temp");
		System.out.println();
		leitorDePPM = new LeitorDePPM("ep/io/betifaria.pbm");
		T = leitorDePPM.tabuleiro;
		for (int y = 0; y < leitorDePPM.altura; y++) {

			for (int x = 0; x < leitorDePPM.largura; x++) {

				pis.print(T[y][x]);
			}
			pis.println();
		}
		pis.close();
	}

}
